[C] Listas Duplamente Encadeadas

Publicado por Enzo de Brito Ferber 09/04/2006

[ Hits: 9.312 ]

Homepage: http://www.maximasonorizacao.com.br

Download lde.c




Codigo de fácil entendimento com funçoes de inserçao em ordem crescente, retirada, e outras :).... Muito bom

  



Esconder código-fonte

/*
 * Programa: Listas Duplamente Encadeadas
 * Arquivo : lde.c
 * Autor   : Enzo Ferber 'Slackware_10'
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MALLOC(a) (a*)malloc(sizeof(a))

struct node{
   int info;
   struct node *next;
   struct node *prior;
};

struct node *head;
struct node *last;

void display(void);
void menu(void);
void push(int);
void pop(int);
void ins(void);
void del(void);
void clear(void);
void flush(void);

int length(void);

void push(int valor){
   struct node *novo;
   struct node *current;
   
    current = head;
   novo = MALLOC(struct node);
   
   if(!head){
      novo->info = valor;
      novo->next = NULL;
      novo->prior = NULL;
      head = last = novo;
   }
   if(valor > last->info){
      novo->info = valor;
      novo->next = NULL;
      novo->prior = last;
      last->next = novo;
      last = novo;
      return;
   }
   if(valor < head->info){
      novo->info = valor;
      novo->next = head;
      novo->prior = NULL;
      head->prior = novo;
      head = novo;
      return;
   }
   while(current){
      if(current->info > valor){
         novo->info = valor;
         novo->next = current;
         novo->prior = current->prior;
         current->prior->next = novo;
         current->prior = novo;
      }
      current = current->next;
   }
}

void pop(int valor){
   struct node *current;
   
   current = head;
   
   if(valor == head->info){
      head = head->next;
      free(head->prior);
      return;
   }
   if(valor == last->info){
      last = last->prior;
      free(last->next);
      return;
   }
   while(current){
      if(current->info == valor){
         current->prior->next = current->next;
         current->next->prior = current->prior;
         free(current);
         return;
      }
      current = current->next;
   }
}

void display(void){
   struct node *aux;
   aux = head;
   if(!head){   
      clear();
      printf("Pilha vazia.");
      getchar();
      getchar();
      return;
   }
   clear();
   while(aux){
      printf("%d\n", aux->info);
      aux = aux->next;
   }
   getchar();
   getchar();
}

void ins(void){
    int valor;
    clear();
    printf("Valor: ");
    flush();
    scanf("%d", &valor);
    push(valor);
}

void del(void){
    int valor;
    clear();
    printf("Valor: ");
    flush();
    scanf("%d", &valor);
    pop(valor);
}

void flush(void){
   fflush(stdin);
}

void clear(void){
   system("cls");
}

void menu(void){
    int op;
    while(1){
        clear(); //limpa a tela
        printf("\n\tLitas duplamente encadeadas\n\n");
        printf("\t1. Inserir\n");
        printf("\t2. Retirar\n");
        printf("\t3. Mostar\n");
        printf("\t4. Sair\n\n");
        printf("\tSua opcao: ");
        flush(); //limpa o buffer de entrada do teclado
        scanf("%d", &op); //le de 'stdin' um valor inteiro e armazena em 'op'
        switch(op){ //faz um 'switch' com o valor de op
            case 1:
                ins();
                break;
            case 2:
                del();
                break;
            case 3:
                display();
                break;
            case 4:
                free(head);
                free(last);
                exit(0);
            default:
                clear();
                printf("Opcao invalida");
                getchar();
        }
    }
}

int main(void){
   head = last = NULL;
   menu();
   
   return 0;
}

Scripts recomendados

Converter arquivos Bitmap para ASCII-art

Entendendo a função fork()

asdfa

Minishell

S. MarioBros - Editor de fase 0.1


  

Comentários
[1] Comentário enviado por blackmarik em 27/05/2010 - 20:20h

Bom código, mas em uma comunidade linux, trocar o comando "cls" por "clear" seja uma boa ideia.

[2] Comentário enviado por EnzoFerber em 21/09/2010 - 08:49h

Hmm... meu erro.

É que na empresa onde trabalho infelizmente trabalho na maior parte do tempo com Windows, então quando faço os codigos acabo esquecendo de modificar esses detalhes... :)

Mas isso não é nada que um linuxer e programador C não saiba fazer sozinho... ;)
[]'s


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts